home *** CD-ROM | disk | FTP | other *** search
Oberon Document | 1996-01-05 | 11.3 KB | 248 lines | [oODC/obnF] |
- Documents.StdDocumentDesc
- Documents.DocumentDesc
- Containers.ViewDesc
- Views.ViewDesc
- Stores.StoreDesc
- Documents.ModelDesc
- Containers.ModelDesc
- Models.ModelDesc
- Stores.ElemDesc
- TextViews.StdViewDesc
- TextViews.ViewDesc
- TextModels.StdModelDesc
- TextModels.ModelDesc
- TextModels.AttributesDesc
- Helvetica
- Helvetica
- Helvetica
- MODULE ObxOmosi;
- IMPORT Domains, Ports, Stores, Views, Controllers, Properties, Dialog;
- CONST
- outside = -1; white = 0; top = 1; left = 2; right = 3; (* Kind *)
- gridDefault = FALSE;
- version = 0;
- TYPE
- Palette = ARRAY 4 OF Ports.Color;
- Kind = INTEGER;
- Field = RECORD
- kind: Kind;
- sel: BOOLEAN
- END;
- Row = ARRAY 8 OF Field;
- Model = ARRAY 15 OF Row;
- StdView = POINTER TO StdViewDesc;
- StdViewDesc = RECORD (Views.ViewDesc)
- (* persistent state *)
- pal: Palette;
- mod: Model;
- (* non-persistent state *)
- sel: INTEGER;
- grid: BOOLEAN
- END;
- FieldPath = ARRAY 3 OF Ports.Point;
- FieldOp = POINTER TO FieldOpDesc;
- FieldOpDesc = RECORD (Domains.OperationDesc)
- v: StdView; i, j: INTEGER; kind: Kind
- END;
- ColorOp = POINTER TO ColorOpDesc;
- ColorOpDesc = RECORD (Domains.OperationDesc)
- v: StdView; n: INTEGER; col: Ports.Color
- END;
- UpdateMsg = RECORD (Views.Message)
- i, j: INTEGER
- END;
- PROCEDURE InitRow (VAR row: Row; k: INTEGER);
- VAR i, l, r: INTEGER;
- BEGIN
- l := (8 - k) DIV 2; r := 8 - l;
- i := 0; WHILE i < l DO row[i].kind := outside; INC(i) END;
- WHILE i < r DO row[i].kind := white; INC(i) END;
- WHILE i < 8 DO row[i].kind := outside; INC(i) END;
- i := 0; WHILE i < 8 DO row[i].sel := FALSE; INC(i) END
- END InitRow;
- PROCEDURE InitPalette
- ield(v, f, x, y, i1, j1);
- IF (i1 # i) OR (j1 # j) THEN
- IF ~(Controllers.extend IN buttons) THEN SelectField(v, f, i, j, FALSE) END;
- i := i1; j := j1;
- SelectField(v, f, i, j, ~prevSel OR ~(Controllers.extend IN buttons))
- END
- UNTIL ~isDown;
- IF ~(Controllers.extend IN buttons) & ((i # i0) OR (j # j0) OR ~prevSel) THEN
- SelectField(v, f, i, j, FALSE)
- END;
- IF ValidField(v, i, j) THEN
- IF Controllers.modify IN buttons THEN
- Dialog.GetColor(v.pal[v.mod[j, i].kind], col, setCol);
- IF setCol THEN
- NEW(cop); cop.v := v; cop.n := v.mod[j, i].kind; cop.col := col;
- Views.Do(v, "Color Change", cop)
- END
- ELSIF ~(Controllers.extend IN buttons) THEN
- Views.BeginScript(v, "Omosi Change", script);
- j := 0;
- WHILE j < 15 DO
- i := 0;
- WHILE i < 8 DO
- IF (v.mod[j, i].sel OR (i = i1) & (j = j1)) & (v.mod[j, i].kind > outside) THEN
- NEW(op); op.v := v; op.i := i; op.j := j;
- op.kind := (v.mod[j, i].kind + 1) MOD 4;
- Views.Do(v, "", op)
- END;
- INC(i)
- END;
- INC(j)
- END;
- Views.EndScript(v, script)
- END
- END
- END Track;
- (* FieldOp *)
- PROCEDURE (op: FieldOp) Do;
- VAR k: Kind; msg: UpdateMsg;
- BEGIN
- k := op.v.mod[op.j, op.i].kind;
- op.v.mod[op.j, op.i].kind := op.kind;
- op.kind := k;
- msg.i := op.i; msg.j := op.j; Views.Broadcast(op.v, msg)
- END Do;
- (* ColorOp *)
- PROCEDURE (op: ColorOp) Do;
- VAR c: Ports.Color;
- BEGIN
- c := op.v.pal[op.n]; op.v.pal[op.n] := op.col; op.col := c;
- Views.Update(op.v, Views.keepFrames)
- END Do;
- (* View *)
- PROCEDURE (v: StdView) Externalize (VAR wr: Stores.Writer);
- VAR i, j: INTEGER;
- BEGIN
- v.Externalize^(wr);
- wr.WriteVersion(version);
- i := 0; WHILE i < 4 DO wr.WriteLInt(v.pal[i]); INC(i) END;
- j := 0;
- WHILE j < 15 DO
- i := 0; WHILE i < 8 DO wr.WriteInt(v.mod[j, i].kind); INC(i) END;
- INC(j)
- END
- END Externalize;
- PROCEDURE (v: StdView) Internalize (VAR rd: Stores.Reader);
- VAR i, j: INTEGER; ver: SHORTINT;
- BEGIN
- v.Internalize^(rd);
- IF ~rd.cancelled THEN
- rd.ReadVersion(version, version, ver);
- IF ~rd.cancelled THEN
- i := 0; WHILE i < 4 DO rd.ReadLInt(v.pal[i]); INC(i) END;
- j := 0;
- WHILE j < 15 DO
- i := 0;
- WHILE i < 8 DO rd.ReadInt(v.mod[j, i].kind); v.mod[j, i].sel := FALSE; INC(i) END;
- INC(j)
- END;
- v.grid := FALSE
- END
- END
- END Internalize;
- PROCEDURE (v: StdView) CopyFrom (source: Views.View);
- BEGIN
- v.CopyFrom^(source);
- WITH source: StdView DO
- v.pal := source.pal; v.mod := source.mod;
- v.sel := source.sel; v.grid := gridDefault
- END
- END CopyFrom;
- PROCEDURE (v: StdView) Restore (f: Views.Frame; l, t, r, b: LONGINT);
- VAR i, j: INTEGER;
- BEGIN
- j := 0;
- WHILE j < 15 DO
- i := 0; WHILE i < 8 DO DrawField(v, f, i, j); INC(i) END;
- INC(j)
- END
- END Restore;
- PROCEDURE (v: StdView) HandleViewMsg (f: Views.Frame; VAR msg: Views.Message);
- BEGIN
- WITH msg: UpdateMsg DO
- DrawField(v, f, msg.i, msg.j)
- ELSE
- END
- END HandleViewMsg;
- PROCEDURE (v: StdView) HandleCtrlMsg (f: Views.Frame; VAR msg: Controllers.Message;
- VAR focus: Views.View);
- VAR i, j, sel: INTEGER;
- BEGIN
- WITH msg: Controllers.TrackMsg DO
- Track(v, f, msg.x, msg.y, msg.modifiers)
- | msg: Controllers.PollOpsMsg DO
- msg.selectable := TRUE; msg.deselectable := TRUE
- | msg: Controllers.SelectMsg DO
- Select(v, msg.set)
- ELSE
- END
- END HandleCtrlMsg;
- PROCEDURE (v: StdView) HandlePropMsg (VAR msg: Properties.Message);
- CONST minW = 3 * Ports.mm; stdW = 7 * Ports.mm; (* per field *)
- BEGIN
- WITH msg: Properties.SizePref DO
- IF (msg.w > Views.undefined) & (msg.h > Views.undefined) THEN
- Properties.ProportionalConstraint(1000, 2 * H(1000), msg.fixedW, msg.fixedH, msg.w, msg.h);
- IF msg.w < 8 * minW THEN
- msg.w := 8 * minW; msg.h := 16 * H(minW)
- END
- ELSE
- msg.w := 8 * stdW; msg.h := 16 * H(stdW)
- END;
- INC(msg.h, 1 * Ports.mm)
- | msg: Properties.FocusPref DO
- msg.setFocus := TRUE
- ELSE
- END
- END HandlePropMsg;
- (* commands *)
- PROCEDURE Deposit*;
- VAR v: StdView;
- BEGIN
- NEW(v); InitPalette(v.pal); InitModel(v.mod); v.sel := 0; v.grid := FALSE; Views.Deposit(v)
- END Deposit;
- PROCEDURE ToggleGrid*;
- VAR v: Views.View;
- BEGIN
- v := Controllers.FocusView();
- IF v # NIL THEN
- WITH v: StdView DO
- v.grid := ~v.grid; Views.Update(v, Views.keepFrames)
- ELSE
- END
- END
- END ToggleGrid;
- PROCEDURE ResetColors*;
- VAR v: Views.View; p0: Palette; script: Domains.Operation; cop: ColorOp; i: INTEGER;
- BEGIN
- v := Controllers.FocusView();
- IF v # NIL THEN
- WITH v: StdView DO
- Views.BeginScript(v, "Reset Colors", script);
- InitPalette(p0);
- i := 0;
- WHILE i < 4 DO
- NEW(cop); cop.v := v; cop.n := i; cop.col := p0[i]; Views.Do(v, "", cop); INC(i)
- END;
- Views.EndScript(v, script)
- ELSE
- END
- END
- END ResetColors;
- END ObxOmosi.
- TextControllers.StdCtrlDesc
- TextControllers.ControllerDesc
- Containers.ControllerDesc
- Controllers.ControllerDesc
- TextRulers.StdRulerDesc
- TextRulers.RulerDesc
- TextRulers.StdStyleDesc
- TextRulers.StyleDesc
- TextRulers.AttributesDesc
- Helvetica
- Documents.ControllerDesc
-